package com.zd.lib.http.okhttp;


import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
import okio.ForwardingSource;
import okio.Okio;
import okio.Source;

/**
 * 下载文件进度
 */
public class ProgressResponseBody extends ResponseBody {

    ResponseBody responseBody;
    private final ProgressListener progressListener;
    private BufferedSource bufferedSource;
    public ProgressResponseBody(ResponseBody originalResponse, ProgressListener progressListener) {
        this.progressListener = progressListener;
        this.responseBody = originalResponse;
    }

    @Override
    public MediaType contentType() {
        return responseBody.contentType();
    }

    @Override
    public long contentLength() {
        return responseBody.contentLength();
    }

    @Override
    public BufferedSource source() {
        if (bufferedSource == null) {
            bufferedSource = Okio.buffer(source(responseBody.source()));
        }
        return  bufferedSource;
//        return Okio.buffer(new ForwardingSource(responseBody.source()) {
//            long bytesReaded = 0;
//
//            @Override
//            public long read(Buffer sink, long byteCount) throws IOException {
//                long bytesRead = super.read(sink, byteCount);
//                bytesReaded += bytesRead == -1 ? 0 : bytesRead;
//                if (progressListener != null) {
//                      progressListener.onRequestProgress(bytesReaded,contentLength());
//                }
//                return bytesRead;
//            }
//        });
    }
    private Source source(Source source) {
        return new ForwardingSource(source) {
            long totalBytesRead = 0L;
            @Override
            public long read(Buffer sink, long byteCount) throws IOException {
                long bytesRead = super.read(sink, byteCount);
                // read() returns the number of bytes read, or -1 if this source is exhausted.
                totalBytesRead += bytesRead != -1 ? bytesRead : 0;
                if (null != progressListener) {
                    progressListener.onRequestProgress(totalBytesRead,contentLength());
                }
                return bytesRead;
            }
        };
    }
}
